home *** CD-ROM | disk | FTP | other *** search
-
- {Hello All! I've recently coded this screen saver.It really looks like snow
- is falling all over, don't you think?
- However, I did not set out to do a snow screen saver and if you experiment
- with it a little you will see that it can even turn out to be a firework!
- If anyone can improve this code or make anything out of it, I would be
- very pleased to have a copy of the source.
- Please, excuse my English.I haven't practised it for a long time.}
-
- PROGRAM SnowScreenSaver; {Nick Batalas 14-6-1994}
- USES crt,dos;
- const
- dots =100; {Set this to more than 100 and the result is awful}
-
- var
- j,k : integer; {loop variables}
- i : longint;
- x,y : array[1..dots] of integer;
- cols : array[1..dots] of byte;
- f,g : word;
-
- {--------------Procedures Needed For This Great Screen Saver------------}
- PROCEDURE SetVideoMode(mode : byte);assembler;
- ASM
- mov AH,0
- mov AL,mode
- int 10h
- END;
-
- PROCEDURE writeDACreg(color,red,green,blue : byte);
- BEGIN
- port[$03C8]:=color;
- port[$03C9]:=red;
- port[$03C9]:=green;
- port[$03C9]:=blue;
- END;
-
- PROCEDURE SetBordColB(color : byte); Assembler;
- ASM
- mov AH,10h
- mov AL,01h
- mov BH,color
- int 10h
- END;
-
- PROCEDURE PutPixel1(x, y : word; color : byte);
- BEGIN
- mem[$A000:x+y*320] := color;
- END;
-
- PROCEDURE HideTextCursor;
- VAR
- regs : registers;
-
- BEGIN
- regs.ah:= 1;
- regs.cx:=$2000;
- intr($10,regs);
- END;
-
- Procedure WaitrBest;Assembler;
- ASM
- cli
- mov dx,3DAh
- @l1:
- in al,dx
- and al,08h
- jnz @l1
- @l2:
- in al,dx
- and al,08h
- jz @l2
- sti
- END;
-
- FUNCTION xf3(ux,t : real) : word; {Calculates the speed of a point}
- BEGIN {on the x axis}
- xf3 := round(ux*t) +160;
- END;
-
- FUNCTION yf3(uy,g,t : real) : word; {Calculates the speed of a point}
- VAR {on the y axis (which is affected}
- u,tmax,hmax : real; {by gravity)}
- ym : array[1..200] of word;
- a : word;
- BEGIN
- u := uy-g*t;
- a:= round(uy*t-1/2*g*t*t);
- yf3 := 200-a ;
- END;
-
- Function RandomCol :byte; {Just a random value between 7 and 15 (I think)}
- BEGIN
- randomcol:=random(6)+9;
- END;
-
- {-------------------------------MAIN PROGRAMME-------------------------}
- BEGIN
- hideTextCursor;
- j:=-50; {calculate the values of the speed of each dot}
- for k:=1 to dots do begin {with this loop}
- j:=j+3;
- x[k]:=j;
- y[k]:=random(150);
- END;
- For i:=1 to dots do {Calculate the color of each dot}
- cols[i]:= randomcol;
- SetVideoMode($13);
- For i:= 1 to 63 do
- writedacreg(15,i,i,i);
- writedacreg(7,15,15,15); {modify color registers in order}
- writedacreg(8,20,20,20); {to give a sense of depth to the}
- writedacreg(9,25,25,25); {dots}
- writedacreg(10,30,30,30);
- writedacreg(11,35,35,35);
- writedacreg(12,40,40,40);
- writedacreg(13,45,45,45);
- writedacreg(14,50,50,50);
- For i:=1 to 5 do {the background color turns to dark blue}
- writedacreg(0,0,0,i);
- setbordcolb(0);
- i:=18500;
- j:=1;
- Repeat
- i:=i+1;
- FOR k:=1 to dots do
- putpixel1(xf3(x[k],0.01*i),yf3(y[k],j,0.01*i),cols[k]);
- waitrbest;
- FOR k:=1 to dots do
- putpixel1(xf3(x[k],0.01*i),yf3(y[k],j,0.01*i),0);
- Until keypressed;
- SetVideoMode(3);
-
- END.